Sebastian Keller [Wed, 21 Jan 2026 18:50:33 +0000 (19:50 +0100)]
st/spinner-content: Fix CoglTexture leak
Most of the members were getting indirectly freed via the
st_spinner_content_set_actor (spinner, NULL) and the subsequent
st_spinner_content_invalidate () on destruction of the actor or
changing of its content when the spinner is stopped.
The texture however was not freed.
This now frees all members explicitly on finalize.
208 (96 direct, 112 indirect) bytes in 1 blocks are definitely lost in loss record 20,960 of 22,464
at 0x4D37833: g_type_create_instance (gtype.c:1877)
by 0x4D1C186: g_object_new_internal.part.0 (gobject.c:2666)
by 0x4D1E0FA: g_object_new_internal (gobject.c:2982)
by 0x4D1E0FA: g_object_new_valist (gobject.c:3004)
by 0x4D1E488: g_object_new (gobject.c:2479)
by 0x5A8B7CB: _cogl_texture_2d_create_base (cogl-texture-2d.c:84)
by 0x572D668: st_spinner_content_paint_content (st-spinner-content.c:175)
by 0x50D2C07: clutter_actor_paint_node (clutter-actor.c:3471)
by 0x50D2C07: clutter_actor_continue_paint (clutter-actor.c:3726)
by 0x511D4F9: clutter_paint_node_paint (clutter-paint-node.c:867)
by 0x50D9717: clutter_actor_paint (clutter-actor.c:3670)
by 0x574199A: st_viewport_paint (st-viewport.c:483)
by 0x50D2C42: clutter_actor_continue_paint (clutter-actor.c:3728)
by 0x511D4F9: clutter_paint_node_paint (clutter-paint-node.c:867)
Carlos Garnacho [Wed, 8 Oct 2025 17:11:37 +0000 (19:11 +0200)]
panel: Use click gesture to trigger window dragging from panel
This gesture is set up on the target phase, in order to ensure only button
presses on the panel itself (and not actors within it) are handled as window
drags.
Carlos Garnacho [Tue, 30 Dec 2025 12:24:41 +0000 (13:24 +0100)]
workspaceAnimation: Perform a grab during workspace switch gestures
Currently, the mechanism to reclaim touch input from clients and into
the gesture is somewhat indirect:
- The swipeTracker gesture(s) will enter in a recognized state
- The MetaGestureTracker will notice the recognized state on a gesture
set up in the ClutterStage actor, and emit META_SEQUENCE_ACCEPTED
on the sequence
- The core will notice the sequence being accepted and call
meta_display_cancel_touch()/meta_wayland_touch_cancel()
- This eventually results in wl_touch.cancel on the affected client(s)
This is a bit too convoluted and special cased, so claim input using
a more traditional way: Using a Clutter grab. This will also result in
touch being cancelled on the Wayland side. This will happen along with
other input, but that's actually a consistence improvemente, since the
other method would not prevent other input (e.g. pointer) while the
workspace gesture is ongoing. This results in glitchy behavior if
multiple input devices are used simultaneously.
Carlos Garnacho [Wed, 5 Nov 2025 11:41:02 +0000 (12:41 +0100)]
pointerA11yTimeout: Set the cursor through ClutterActor API
Set the cursor on the stage. This differs with the "root" cursor
approach in that actors with a non-inherited cursor (e.g. I-beam on
text actors) will stick to that instead of showing the cursor as
set here.
If that's turns out not to be enough, might make sense to move this
piece of a11y feedback to Mutter.
Allow org.freedesktop.Malcontent.SessionLimits.Extend action id when
screen is locked, so it's possible to show polkit authentication dialogs
on lock screen for parental controls session limits integration in the
future.
Update org.freedesktop.MalcontentTimer1.Child interface to include the
new screen time extensions functionality.
The interface has been updated from https://gitlab.freedesktop.org/pwithnall/malcontent/-/blob/main/libmalcontent-timer/org.freedesktop.MalcontentTimer1.Child.xml,
and it has not been modified after being copied.
Carlos Garnacho [Mon, 24 Nov 2025 16:16:57 +0000 (17:16 +0100)]
shellDBus: Add new BrightnessChanged signal to brightness interface
This does actually track user-triggered changes, so other pieces
(i.e. gsd-power) can react to this. This will help in reintroducing
brightness re-normalization when brightness is driven by ALS sensors.
Carlos Garnacho [Tue, 23 Dec 2025 14:09:09 +0000 (15:09 +0100)]
layout: Drop fallback for hot corner without barriers
The BARRIER backend capability was been moot for a long time since
XInput 2.4 became widespread and barriers became commonplace. And
even further recently with the removal of the X11 backend. The
native backend has always implemented barriers.
It seems we can drop this fallback handling. Since the _entered flag
was only used in those paths, the leave event vfunc is unnecessary too.
Florian Müllner [Thu, 19 Dec 2019 22:07:55 +0000 (23:07 +0100)]
environment: Add async ease variants
Ease functions can be used nested, and often need to complete before
performing an action.
This is currently handled by providing onComplete/onStopped callbacks,
which can get tedious when nesting.
To make these cases more convenient, add async variants that return
a promise that is resolved when the transition completes, so that
callers can await the result instead.
In case the transition was interrupted, the promise is rejected with a
CANCELLED error, so that it stops a promises chain and can easily be
filtered out in catch handlers.
revisto [Wed, 17 Dec 2025 21:13:47 +0000 (00:43 +0330)]
calendar: Center align "No Notifications" text
The "No Notifications" placeholder was left-aligned instead of
centered, which looked unbalanced in the empty notification state.
Fix by centering the label.
Make the parental controls session limits related variables and
functions have more specific names, more representative of their
contents and function.
timeLimitsManager: Factor out wellbeing-daily-limit-enabled
Factor out wellbeing-daily-limit-enabled specific for the wellbeing
screen time limits functionality to a separate function, which will make
it easier in the future to make the daily-limit-enabled property also
handle parental controls session limits functionality.
Adrian Vovk [Thu, 13 Nov 2025 19:01:20 +0000 (14:01 -0500)]
data: Overhaul systemd units
This simplifies the structure of the systemd units, since we no longer
support running with X11. But it also allows us to pass in the
gnome-shell session mode via systemd.
This removes the need for GDM to have any special code to handle the
GNOME_SHELL_SESSION_MODE environment variable, and allows GNOME sessions
to specify directly what session mode they need without the involvement
of GDM. This makes it trivial to define custom gnome-session sessions
that use custom gnome-shell session modes.
Sessions that consist entirely of a gnome-shell mode (like the
gnome-classic session) will need to do a little more legwork to define
themselves as proper gnome-session sessions.
revisto [Tue, 16 Dec 2025 15:58:59 +0000 (19:28 +0330)]
status/volume: Use default color for muted microphone indicator
The muted indicator status is currently hard to distinguish from the
unmuted one. As there is no privacy concern when muted, don't apply
the privacy-indicator styling in that state so the states become
more distinct.
Hari Rana [Sat, 13 Dec 2025 03:36:57 +0000 (22:36 -0500)]
overviewControls: Use ease-out-sine when entering overview and app grid
Using animations with slower initial curves on display-wide
layout shifts may provide a smoother experience to users of
low(er) refresh rate and/or large(r) displays, as they avoid
skipping large chunks of frames, making it less choppy at
the beginning of the animation.
screenShield: Fix user deselection after idle in greeter
When the session goes idle, _maybeCancelDialog() cancels any ongoing
authentication dialog. Commit b16ee1a added code to grab focus after
cancellation, ensuring it stayed on the lock screen curtain rather than
wherever cancel() placed it. This was needed to handle keyboard events
like Enter to raise the unlock dialog.
Commit 727c84251 changed this to grab focus on the dialog itself, since
the lock screen architecture had evolved. However, in the greeter case
there is no separate curtain - the LoginDialog is shown directly and
cancel() already restores focus to the user list via _showUserList().
The additional focus grab on the dialog container moved focus away from
the selected user as soon as the screen began to dim, causing the
username to appear deselected when returning from idle.
Similarly, _ensureUnlockDialog() and _resetLockScreen() grabbed focus on
the dialog container when the screen fully blanked, causing the same
issue.
For the greeter, replace grab_key_focus() with activate(), which
delegates to LoginDialog.activate() and properly focuses the user list.
For the unlock dialog, keep the original grab_key_focus() behavior -
calling UnlockDialog.activate() would invoke _showPrompt(), which would
interfere with commit 4bfa30085 that returns to the clock view after
suspend.
Florian Müllner [Thu, 13 Nov 2025 19:01:04 +0000 (20:01 +0100)]
status/powerProfiles: Indicate non-default power mode in top bar
It is quite easy to switch the power profile for some specific
purpose, and then forgetting to change it back and experiencing
unexpected performance behavior later.
To help with that, indicate the active power profile in the top
bar if it diverges from the default 'balanced' one.
Florian Müllner [Thu, 13 Nov 2025 19:13:37 +0000 (20:13 +0100)]
panel: Move power profiles indicator next to the system one
For devices with a battery, the system indicator shows the current
charge level. As power profiles are related to power, it makes sense
to keep the two indicators next to each other.
Florian Müllner [Tue, 9 Dec 2025 13:33:38 +0000 (14:33 +0100)]
swipeTracker: Handle touchpad gestures on actor
Touchscreen gestures and scrolling are already handled by events
on the associated actor rather than the stage. There's no good
reason to not do the same for touchpad gestures as well.
Florian Müllner [Fri, 5 Dec 2025 09:06:32 +0000 (10:06 +0100)]
workspaceAnimation: Use separate WorkspaceBackground class
Separating WorkspaceGroup and WorkspaceBackground allows each to
track its own set of windows without special-casing exceptions.
This will also give us more flexibility in the future, if we need
to reuse the background elsewhere. This may happen if we optionally
change the animation to a crossfade for the new `reduced-motion`
setting.
Florian Müllner [Fri, 5 Dec 2025 08:25:30 +0000 (09:25 +0100)]
workspaceAnimation: Split out BaseWorkspaceGroup
Since we started to show DESKTOP windows as part of the background
during the workspace animation, we need to track both the windows
relevant for the monitor/workspace and DESKTOP windows.
We are about to split out the background handling into its own class.
To prepare for this, split out a BaseWorkspaceGroup class that handles the
basic "create clones of relevant windows and track them" functionality
common to both cases.
environment: Ignore animation events after shutdown
As soon as the shutdown starts, any animation event does not make sense,
although during this phase the clutter timelines may still proceed and
potentially calling invalid code in their callbacks.
Prevent this from happening by disconnecting from any timeline signal
we are connected to as soon as the `shutdown` signal is emitted
Ian Off [Thu, 21 Aug 2025 04:27:43 +0000 (23:27 -0500)]
screenshot: End screencast with same keybinding as start screencast
Currently, the screencast keyboard shortcut shows the UI to begin a
screencast, but there is no way to end it with a keyboard shortcut.
This behavior is inconvenient and seems to be a regression, as a wide
variety of online resources recommend using the same shortcut to start
and end screencasts.
This commit introduces a simple check when the showScreenRecordingUI
function is called by the show-screen-recording-ui keybinding.
If the showScreenRecordingUI function is called while a screencast
is in progress, the stopScreencast function is called instead
of opening the screenshot UI in screencast mode.
environment: Generalize easeActorProperty to animatable case
We're not handling actors only with it but also St.Adjustment that is a
Clutter.Animatable, so let's name it for what it is, and adjust the
parameter so that its type is not given for granted
overviewControls: Wait for all animation promises on startup
Currently on startup we're just waiting for a single animation (the dash
one) being completed, while this is acceptable since the animation
duration is not shorter or longer than others, it's still not clean, as
technically we should just wait for all the pending animations of the
set before calling the startup animation completed.
Florian Müllner [Fri, 28 Nov 2025 00:43:33 +0000 (01:43 +0100)]
layout: Resolve immediately after loading the background
We currently resolve the promise in a low-priority idle handler
after the background was loaded, so that the system can settle
down after the initial load before doing the animation.
Promises are already resolved on the main loop (albeit with
a high priority), so hopefully the explicit idle source isn't
necessary anymore.
Florian Müllner [Fri, 28 Nov 2025 00:13:29 +0000 (01:13 +0100)]
layout: Use promise to wait for background to load
This allows us to separate the end of the loading operation
from the steps that follow it. We will soon use that to
express the startup animation as a series of (async) steps
instead of a chain of function calls.
Florian Müllner [Thu, 27 Nov 2025 21:47:46 +0000 (22:47 +0100)]
layout: Use promise to ensure primary monitor
Both loading the system background and setting up the startup animation
depends on having a primary monitor, so we wait for the monitor to
appear if necessary.
Currently this is done differently in each case, once by having a hook
to recall a method when the monitor appears, and once by re-running an
idle handler.
Replace this with an async `_ensurePrimaryMonitor()` method that we can
use to await the primary monitor where needed.